/* 核心递归函数 */
bool Checker(BinaryTree tree, TElemSet *min_key, TElemSet *max_key);

bool IsBST(BinaryTree tree) {
    TElemSet min_key, max_key;
    return Checker(tree, &min_key, &max_key);
}

bool Checker(BinaryTree tree, TElemSet *min_key, TElemSet *max_key) {
    /* 核心递归函数 */
    /* min_key 和 max_key 是tree中所有结点键值的下、上界 */
    TElemSet left_min, left_max; /* 左子树键值的下、上界 */
    TElemSet right_min, right_max; /* 右子树键值的下、上界 */
    bool left_ret, right_ret; /* 左右子树的判断结果 */
    bool ret; /* 最终判断结果 */

    if (tree == NULL) {
        ret = true; /* 空树肯定是BST */
    } else { /* 一般情况下 */
        ret = left_ret = right_ret = false; /* 判断结果初始化 */
        /* 分别判断左右子树 */
        if (tree->left == NULL ||
        (Checker(tree->left, &left_min, &left_max) == true &&
                           left_max < tree->data)
           ) { /* 若左子树是空；或非空、正常、最大键值小于根结点键值 */
            left_ret = true;
        }
        if (tree->right == NULL ||
        (Checker(tree->right, &right_min, &right_max) == true &&
                            right_min > tree->data)
           ) { /* 若右子树是空；或非空、正常、最小键值大于根结点键值 */
            right_ret = true;
        }
        /* 如果两边的检查都没问题，则更新上下界 */
        if (left_ret == true && right_ret == true) {
            (*min_key) = (tree->left == NULL) ? tree->data : left_min;
            (*max_key) = (tree->right == NULL) ? tree->data : right_max;
            ret = true;
        }
    }
    return ret;
}